package com.peacebird.quick.job.executor;

import cn.hutool.core.date.DateUnit;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.http.HttpRequest;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.peacebird.quick.job.config.AppConfig;
import com.peacebird.quick.job.contants.QuickContants;
import com.peacebird.quick.job.model.BasTradeImport;
import com.peacebird.quick.job.service.TradeImportService;
import com.peacebird.utils.contants.ComContants;
import com.peacebird.utils.dto.ResultDto;
import com.peacebird.utils.excel.ExcelReader;
import com.peacebird.utils.file.FileUtil;
import com.peacebird.utils.ftp.FTPUtil;
import com.xxl.job.core.biz.model.ReturnT;
import com.xxl.job.core.handler.annotation.XxlJob;
import com.xxl.job.core.log.XxlJobLogger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @Author: ZYZ
 * @DateTime: 2020/3/5 15:41
 * @Description:
 */
@Component
public class TradeImportJob {

    private final String AL_MSG_TYPE = "400";
    private final String AL_SHOP_TYPE_SHIPID = "shopid";



    @Autowired
    TradeImportService tradeImportService;

    @Autowired
    AppConfig appConfig;

    private final String FILE_DIR = "sycm";

    @XxlJob("TradeImportAutoHandler")
    public ReturnT<String> TradeImportAutoHandler(String param) throws Exception {
        try {
            FTPUtil ftpUtil  = new FTPUtil(appConfig.getFtpAddress(),Integer.valueOf(appConfig.getFtpPort()),appConfig.getFtpUsername(),
                    appConfig.getFtpPassword(),appConfig.getBasePath(),appConfig.getBackupBasePath());

            SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");

            XxlJobLogger.log("开始从FTP服务器下载excel文件...");
            //先下载ftp上的所有文件
            Map<String, Object> fileMap = ftpUtil.downLoadTableFile(FILE_DIR, appConfig.getLocalSavePath(), QuickContants.EXCEL_TPYE_KF);

            XxlJobLogger.log("开始遍历本地文件{}/{}",appConfig.getLocalSavePath(),FILE_DIR);
            //遍历本地文件进行处理
            List<String> fileNameList = FileUtil.getFileNames(appConfig.getLocalSavePath() + "/" + FILE_DIR);

            if(null != fileNameList && fileNameList.size() >0){
                for(String fileName: fileNameList){
                    XxlJobLogger.log("开始解析文件名： {} ，判断店铺和类型的合法性.",fileName) ;
                    String[] strArr = fileName.split("_");
                    if(strArr.length > 1){
                        if( QuickContants.EXCEL_TPYE_KF.equals(strArr[1])){
                            String shopId = strArr[0];
                            String shopName = tradeImportService.checkShopId(shopId);
                            if(StrUtil.isNotBlank(shopName)){
                                String fileLocalPath =appConfig.getLocalSavePath() + "/" + FILE_DIR + "/" + fileName;
                                XxlJobLogger.log("开始解析本地文件： {} ，转化excel文件为List<BasTradeImport>,忽略前{}行",
                                        fileLocalPath,5) ;
                                //开始执行文件解析和导入
                                List<BasTradeImport> list = ExcelReader.readExcel(fileLocalPath,5,BasTradeImport.class);

                                if(null != list && list.size()> 0){

                                    XxlJobLogger.log("开始判断导入数据是否已经存在(bas_tradeImport)，shopId:{}，importDate:{} ",shopId,list.get(0).getMakeDate()) ;
                                    Date queryDate = df.parse(list.get(0).getMakeDate());

                                    int count = tradeImportService.queryTradeRepition(shopId,queryDate);
                                    if(count == 0){
                                        XxlJobLogger.log("开始执行导入，size： {} ",list.size()) ;
                                        ResultDto result = tradeImportService.insertTradeImportNew(list,shopId);
                                    }else{
                                        XxlJobLogger.log("该日期数据已经存在，不执行导入") ;
                                        //判断该日期是否是昨天的，若是前天或者更早的，则提供通知用户手动导入或者重新下载
                                        Date today = DateUtil.parse(DateUtil.today(),"yyyy-MM-dd");
                                        long betweenDay = DateUtil.between(queryDate, today, DateUnit.DAY);
                                        if (betweenDay > 1){

                                            StringBuffer sb = new StringBuffer();
                                            sb.append("店铺：")
                                                    .append(shopName)
                                                    .append("@@")
                                                    .append("文件数据日期:")
                                                    .append(DateUtil.format(queryDate, "yyyy-MM-dd"))
                                                    .append("@@")
                                                    .append("当前系统时间:")
                                                    .append(DateUtil.today())
                                                    .append("@@")
                                                    .append("操作:待下载文件正常后，快返系统手工导入或者码栈重新自动下载导入");
                                            HashMap<String, Object> paramMap = new HashMap<>();
                                            paramMap.put("alType", "markdown");
                                            paramMap.put("title", "生意参谋下载文件数据异常提醒");
                                            paramMap.put("text", "生意参谋自动下载文件数据日期有误");
                                            paramMap.put("ecType", AL_MSG_TYPE);
                                            paramMap.put("content", sb.toString());
                                            paramMap.put("shopId", shopId);
                                            paramMap.put("shopIdType", AL_SHOP_TYPE_SHIPID);
                                            JSONObject jsonObj=new JSONObject(paramMap);
                                            String result2 = HttpRequest.post(appConfig.getAlMsgApiUrl())
                                                    .body(jsonObj.toString())
                                                    .execute().body();
                                            JSONObject jsonObject = JSONUtil.parseObj(result2);
                                            String code = jsonObject.getStr("code");
                                            if(ComContants.STR_200.equals(code)){
                                                XxlJobLogger.log("发送钉钉提醒成功：{},{}",shopName,shopId);
                                            }else{
                                                XxlJobLogger.log("发送钉钉提醒失败：{},信息:",shopName,jsonObject.getStr("msg"));
                                            }
                                        }
                                    }
                                }else{
                                    XxlJobLogger.log("转化的List<BasTradeImport> 长度为0，不执行导入 ") ;
                                }
                                //执行服务器文件备份
                                XxlJobLogger.log("开始执行FTP服务器文件备份:{}/{} ",FILE_DIR,fileName) ;
                                ftpUtil.renameFile(FILE_DIR, fileName);
                                //删除本地文件
                                XxlJobLogger.log("开始删除本地服务器文件:{}  ",fileLocalPath) ;
                                FileUtil.removeFile(fileLocalPath);
                                //延迟执行下一个文件
                                XxlJobLogger.log("执行完毕，等待10s执行下一个文件导入") ;
                                Thread.sleep(10 * 1000);
                            }else{
                                XxlJobLogger.log(" 店铺ID 【{}】 无效，不执行导入 ",shopId) ;
                            }

                        }else{
                            XxlJobLogger.log(" 文件类型 【{}】 无效，不执行导入。正确类型应为 【{}】 ",strArr[1],QuickContants.EXCEL_TPYE_KF) ;
                        }
                    }

                }

            }else{
                XxlJobLogger.log(" 本地文件个数为0，不执行导入 ") ;
            }
        }catch (Exception e) {
           // e.printStackTrace();
            XxlJobLogger.log(" Exception：{} ",e.getMessage()) ;
            return ReturnT.FAIL;
        }

        return ReturnT.SUCCESS;
    }
}
